home *** CD-ROM | disk | FTP | other *** search
/ Aminet 8 / Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso / Aminet / dev / gcc / gcc270_src.lha / gcc-2.7.0-amiga / config / m68k / news.h < prev    next >
C/C++ Source or Header  |  1995-06-15  |  18KB  |  493 lines

  1. /* Definitions of target machine for GNU compiler.  SONY NEWS-OS 4 version.
  2.    Copyright (C) 1987, 1989, 1993, 1994 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. GNU CC is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU CC; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 59 Temple Place - Suite 330,
  19. Boston, MA 02111-1307, USA.  */
  20.  
  21. #ifndef USE_GAS
  22. /* This controls conditionals in m68k.h.  */
  23. #define MOTOROLA        /* Use Motorola syntax rather than "MIT" */
  24. #define SGS_NO_LI        /* Suppress jump table label usage */
  25. #endif
  26.  
  27. #define NO_DOLLAR_IN_LABEL
  28. #define NO_DOT_IN_LABEL
  29.  
  30. #include "m68k/m68k.h"
  31.  
  32. /* See m68k.h.  7 means 68020 with 68881.  */
  33.  
  34. #define TARGET_DEFAULT 7
  35.  
  36. /* Define __HAVE_68881__ in preprocessor, unless -msoft-float is specified.
  37.    This will control the use of inline 68881 insns in certain macros.  */
  38.  
  39. #define CPP_SPEC "%{!msoft-float:-D__HAVE_68881__}"
  40.  
  41. /* Names to predefine in the preprocessor for this target machine.  */
  42. /* These are the ones defined by Sony, plus mc68000 for uniformity with
  43.    GCC on other 68000 systems.  */
  44.  
  45. #ifdef MOTOROLA
  46. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews700 -D__motorola__ -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  47. #else
  48. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews700 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  49. #endif
  50.  
  51. /* These conditionals tested for different submodels,
  52.    but they were incorrect since they tested the host rather than the target.
  53.    The choice of model shouldn't actually matter.  */
  54.  
  55. #if 0
  56. #ifdef news800
  57. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews800 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  58. #endif
  59. #ifdef news900
  60. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dnews900 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  61. #endif
  62. #ifdef news1500
  63. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1500 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  64. #endif
  65. #ifdef news1700
  66. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1700 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  67. #endif
  68. #ifdef news1800
  69. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1800 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  70. #endif
  71. #ifdef news1900
  72. #define CPP_PREDEFINES "-Dunix -Dbsd43 -Dsony -Dsony_news -Dmc68000 -Dmc68020 -Dmc68030 -Dnews1900 -Asystem(unix) -Asystem(bsd) -Acpu(m68k) -Amachine(m68k)"
  73. #endif
  74. #endif
  75.  
  76. /* Link with libg.a when debugging, for dbx's sake.  */
  77.  
  78. #define LIB_SPEC "%{g:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p} "
  79.  
  80. /* This is BSD, so it wants DBX format.  */
  81.  
  82. #define DBX_DEBUGGING_INFO
  83.  
  84. #if 0
  85. /* This is to be compatible with types.h.
  86.    It was found to be necessary with Newsos 3.  */
  87.  
  88. #define SIZE_TYPE "long int"
  89. #endif
  90.  
  91. /* Override parts of m68k.h to fit Sony's assembler syntax.  */
  92.  
  93. #undef BIGGEST_ALIGNMENT
  94. #undef CALL_USED_REGISTERS
  95. #undef FUNCTION_VALUE
  96. #undef LIBCALL_VALUE
  97. #undef FUNCTION_PROFILER
  98.  
  99. #ifdef MOTOROLA
  100. #undef FUNCTION_PROLOGUE
  101. #undef FUNCTION_EPILOGUE
  102. #undef REGISTER_NAMES
  103. #undef ASM_OUTPUT_REG_PUSH
  104. #undef ASM_OUTPUT_REG_POP
  105. #undef ASM_OUTPUT_DOUBLE
  106. #undef ASM_OUTPUT_SKIP
  107. #undef ASM_FORMAT_PRIVATE_NAME
  108. #undef PRINT_OPERAND
  109. #undef PRINT_OPERAND_ADDRESS
  110. #endif  
  111.  
  112. #undef ASM_OUTPUT_ALIGN
  113.  
  114. /* There is no point aligning anything to a rounder boundary than this.  */
  115. #define BIGGEST_ALIGNMENT 32
  116.  
  117. /* A bitfield declared as `int' forces `int' alignment for the struct.  */
  118. #define PCC_BITFIELD_TYPE_MATTERS 1
  119.   
  120. /* NEWS makes d2, d3, fp2 and fp3 unsaved registers, unlike the Sun system.  */
  121.   
  122. #define CALL_USED_REGISTERS \
  123.  {1, 1, 1, 1, 0, 0, 0, 0, \
  124.   1, 1, 0, 0, 0, 0, 0, 1, \
  125.   1, 1, 1, 1, 0, 0, 0, 0}
  126.  
  127. /* NEWS returns floats and doubles in fp0, not d0/d1.  */
  128.  
  129. #define FUNCTION_VALUE(VALTYPE,FUNC) LIBCALL_VALUE (TYPE_MODE (VALTYPE))
  130.  
  131. #define LIBCALL_VALUE(MODE)                           \
  132.  gen_rtx (REG, (MODE),                               \
  133.       ((TARGET_68881                           \
  134.         && ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode)) \
  135.        ? 16 : 0))
  136.  
  137. #define ASM_OUTPUT_ALIGN(FILE,LOG)    \
  138.   fprintf (FILE, "\t.align %d\n", (LOG))
  139.  
  140. #ifdef MOTOROLA
  141.  
  142. /* Don't try to define `gcc_compiled.' since the assembler does not
  143.    accept symbols with periods.  This is no real loss since GDB only
  144.    really needs it for parms passed in registers.  */
  145. #define ASM_IDENTIFY_GCC(FILE)
  146.  
  147. #define FUNCTION_PROLOGUE(FILE, SIZE)     \
  148. { register int regno;                        \
  149.   register int mask = 0;                    \
  150.   extern char call_used_regs[];                    \
  151.   int fsize = ((SIZE) + 3) & -4;                \
  152.   if (frame_pointer_needed)                    \
  153.     { if (fsize < 0x8000)                            \
  154.         fprintf (FILE, "\tlink fp,#%d\n", -fsize);        \
  155.       else if (TARGET_68020)                                    \
  156.         fprintf (FILE, "\tlink.l fp,#%d\n", -fsize);            \
  157.       else                            \
  158.     fprintf (FILE, "\tlink fp,#0\n\tsub.l #%d,sp\n", fsize);\
  159.     }                                \
  160.   else if (fsize)                        \
  161.     {                                \
  162.       int amt = fsize + 4;                    \
  163.       /* Adding negative number is faster on the 68040.  */    \
  164.       if (fsize + 4 < 0x8000)                    \
  165.     asm_fprintf (FILE, "\tadd.w %0I%d,%Rsp\n", - amt);    \
  166.       else                            \
  167.     asm_fprintf (FILE, "\tadd.l %0I%d,%Rsp\n", - amt);    \
  168.     }                                \
  169.   for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++)    \
  170.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  171.        mask |= 1 << (regno - 16);                \
  172.   if (mask != 0)                        \
  173.     fprintf (FILE, "\tfmovem.x #0x%x,-(sp)\n", mask & 0xff);    \
  174.   mask = 0;                            \
  175.   for (regno = 0; regno < 16; regno++)                \
  176.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  177.        mask |= 1 << (15 - regno);                \
  178.   if (frame_pointer_needed)                    \
  179.     mask &= ~ (1 << (15-FRAME_POINTER_REGNUM));            \
  180.   if (exact_log2 (mask) >= 0)                    \
  181.     fprintf (FILE, "\tmove.l %s,-(sp)\n", reg_names[15 - exact_log2 (mask)]);  \
  182.   else if (mask) fprintf (FILE, "\tmovem.l #0x%x,-(sp)\n", mask); }
  183.  
  184. #define FUNCTION_PROFILER(FILE, LABEL_NO) \
  185.    fprintf (FILE, "\tmove.l #LP%d,d0\n\tjsr mcount\n", (LABEL_NO));
  186.  
  187. #define FUNCTION_EPILOGUE(FILE, SIZE) \
  188. { register int regno;                        \
  189.   register int mask, fmask;                    \
  190.   register int nregs;                        \
  191.   int offset, foffset;                        \
  192.   extern char call_used_regs[];                    \
  193.   int fsize = ((SIZE) + 3) & -4;                \
  194.   int big = 0;                            \
  195.   nregs = 0;  fmask = 0;                    \
  196.   for (regno = 16; regno < FIRST_PSEUDO_REGISTER; regno++)    \
  197.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  198.       { nregs++; fmask |= 1 << (23 - regno); }            \
  199.   foffset = nregs * 12;                        \
  200.   nregs = 0;  mask = 0;                        \
  201.   if (frame_pointer_needed) regs_ever_live[FRAME_POINTER_REGNUM] = 0; \
  202.   for (regno = 0; regno < 16; regno++)                \
  203.     if (regs_ever_live[regno] && ! call_used_regs[regno])    \
  204.       { nregs++; mask |= 1 << regno; }                \
  205.   offset = foffset + nregs * 4;                    \
  206.   if (offset + fsize >= 0x8000                     \
  207.       && frame_pointer_needed                    \
  208.       && (mask || fmask))                    \
  209.     { fprintf (FILE, "\tmove.l #%d,a0\n", -fsize);        \
  210.       fsize = 0, big = 1; }                    \
  211.   if (exact_log2 (mask) >= 0) {                    \
  212.     if (big)                            \
  213.       fprintf (FILE, "\tmove.l (-%d,fp,a0.l),%s\n",        \
  214.            offset + fsize, reg_names[exact_log2 (mask)]);    \
  215.     else if (! frame_pointer_needed)                \
  216.       fprintf (FILE, "\tmove.l (sp)+,%s\n",            \
  217.            reg_names[exact_log2 (mask)]);            \
  218.     else                            \
  219.       fprintf (FILE, "\tmove.l (-%d,fp),%s\n",            \
  220.            offset + fsize, reg_names[exact_log2 (mask)]); }    \
  221.   else if (mask) {                        \
  222.     if (big)                            \
  223.       fprintf (FILE, "\tmovem.l (-%d,fp,a0.l),#0x%x\n",        \
  224.            offset + fsize, mask);                \
  225.     else if (! frame_pointer_needed)                \
  226.       fprintf (FILE, "\tmovem.l (sp)+,#0x%x\n", mask);        \
  227.     else                            \
  228.       fprintf (FILE, "\tmovem.l (-%d,fp),#0x%x\n",        \
  229.            offset + fsize, mask); }                \
  230.   if (fmask) {                            \
  231.     if (big)                            \
  232.       fprintf (FILE, "\tfmovem.x (-%d,fp,a0.l),#0x%x\n",    \
  233.            foffset + fsize, fmask);                \
  234.     else if (! frame_pointer_needed)                \
  235.       fprintf (FILE, "\tfmovem.x (sp)+,#0x%x\n", fmask);    \
  236.     else                            \
  237.       fprintf (FILE, "\tfmovem.x (-%d,fp),#0x%x\n",        \
  238.            foffset + fsize, fmask); }            \
  239.   if (frame_pointer_needed)                    \
  240.     fprintf (FILE, "\tunlk fp\n");                \
  241.   else if (fsize)                        \
  242.     {                                \
  243.       if (fsize + 4 < 0x8000)                    \
  244.     fprintf (FILE, "\tadd.w #%d,sp\n", fsize + 4);        \
  245.       else                            \
  246.     fprintf (FILE, "\tadd.l #%d,sp\n", fsize + 4);        \
  247.     }                                \
  248.   if (current_function_pops_args)                \
  249.     fprintf (FILE, "\trtd #%d\n", current_function_pops_args);    \
  250.   else fprintf (FILE, "\trts\n"); }
  251.  
  252. /* Difference from m68k.h is in `fp' instead of `a6'.  */
  253.  
  254. #define REGISTER_NAMES \
  255. {"d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",    \
  256.  "a0", "a1", "a2", "a3", "a4", "a5", "fp", "sp",    \
  257.  "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7"}
  258.  
  259. /* This is how to output an insn to push a register on the stack.
  260.    It need not be very fast code.  */
  261.  
  262. #define ASM_OUTPUT_REG_PUSH(FILE,REGNO)  \
  263.   fprintf (FILE, "\tmove.l %s,-(sp)\n", reg_names[REGNO])
  264.  
  265. /* This is how to output an insn to pop a register from the stack.
  266.    It need not be very fast code.  */
  267.  
  268. #define ASM_OUTPUT_REG_POP(FILE,REGNO)  \
  269.   fprintf (FILE, "\tmove.l (sp)+,%s\n", reg_names[REGNO])
  270.   
  271. #define ASM_OUTPUT_DOUBLE(FILE,VALUE)  \
  272. do { char dstr[30];                    \
  273.      REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr);    \
  274.      fprintf (FILE, "\t.double 0d%s\n", dstr);        \
  275.    } while (0)
  276.  
  277. #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
  278.   fprintf (FILE, "\t.space %u\n", (SIZE))
  279.  
  280. #if 0
  281. /* The NEWS assembler in version 3.4 complains about fmove.d, but this
  282.    macro proved not to work right.  3.4 is old, so forget about it. */
  283. #define ASM_OUTPUT_OPCODE(FILE, STRING) \
  284. {                        \
  285.   if (!strncmp (STRING, "fmove.d", 7)        \
  286.       && CONSTANT_P (operands[1]))        \
  287.     {                        \
  288.       fprintf (FILE, "fmove.x");        \
  289.       STRING += 7;                \
  290.     }                        \
  291. }
  292. #endif
  293.  
  294. /* Store in OUTPUT a string (made with alloca) containing
  295.    an assembler-name for a local static variable named NAME.
  296.    LABELNO is an integer which is different for each call.  */
  297.  
  298. #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO)    \
  299. ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 13),    \
  300.   sprintf ((OUTPUT), "%s$$$%d", (NAME), (LABELNO)))
  301.  
  302. #define PRINT_OPERAND(FILE, X, CODE)  \
  303. { if (CODE == '.') fprintf (FILE, ".");                    \
  304.   else if (CODE == '#') fprintf (FILE, "#");                \
  305.   else if (CODE == '-') fprintf (FILE, "-(sp)");            \
  306.   else if (CODE == '+') fprintf (FILE, "(sp)+");            \
  307.   else if (CODE == '@') fprintf (FILE, "(sp)");                \
  308.   else if (CODE == '!') fprintf (FILE, "fpcr");                \
  309.   else if (CODE == '$') {if (TARGET_68040_ONLY) fprintf (FILE, "s");}    \
  310.   else if (CODE == '&') {if (TARGET_68040_ONLY) fprintf (FILE, "d");}    \
  311.   else if (CODE == '/')                            \
  312.     ;                                    \
  313.   else if (GET_CODE (X) == REG)                        \
  314.     fprintf (FILE, "%s", reg_names[REGNO (X)]);                \
  315.   else if (GET_CODE (X) == MEM)                        \
  316.     output_address (XEXP (X, 0));                    \
  317.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode)    \
  318.     { REAL_VALUE_TYPE r;                        \
  319.       REAL_VALUE_FROM_CONST_DOUBLE (r, X);                \
  320.       if (CODE == 'f')                            \
  321.         { char dstr[30];                        \
  322.           REAL_VALUE_TO_DECIMAL (r, "%.9e", dstr);            \
  323.           if (REAL_VALUE_ISINF (r) || REAL_VALUE_ISNAN (r)) {        \
  324.             if (REAL_VALUE_NEGATIVE (r))                \
  325.               fprintf (FILE, "#0f-99e999");                \
  326.             else                            \
  327.               fprintf (FILE, "#0f99e999"); }                \
  328.           else if (REAL_VALUE_MINUS_ZERO (r))                \
  329.             fprintf (FILE, "#0f-0.0");                    \
  330.           else                                \
  331.             fprintf (FILE, "#0f%s", dstr);                 \
  332.         }                                \
  333.       else                                \
  334.         { long l;                            \
  335.           REAL_VALUE_TO_TARGET_SINGLE (r, l);                \
  336.           fprintf (FILE, "#0x%x", l);                    \
  337.         }}                                \
  338.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == XFmode)    \
  339.     { REAL_VALUE_TYPE r;                        \
  340.       REAL_VALUE_FROM_CONST_DOUBLE (r, X);                \
  341.       ASM_OUTPUT_LONG_DOUBLE_OPERAND (FILE, r); }            \
  342.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode)    \
  343.     { REAL_VALUE_TYPE r; char dstr[30];                    \
  344.       REAL_VALUE_FROM_CONST_DOUBLE (r, X);                \
  345.       REAL_VALUE_TO_DECIMAL (r, "%.20e", dstr );            \
  346.       if (REAL_VALUE_ISINF (r) || REAL_VALUE_ISNAN (r)) {        \
  347.         if (REAL_VALUE_NEGATIVE (r))                    \
  348.           fprintf (FILE, "#0d-99e999");                    \
  349.         else                                \
  350.           fprintf (FILE, "#0d99e999"); }                \
  351.       else if (REAL_VALUE_MINUS_ZERO (r))                \
  352.           fprintf (FILE, "#0d-0.0");                    \
  353.       else                                \
  354.           fprintf (FILE, "#0d%s", dstr); }                \
  355.   else if (CODE == 'b') output_addr_const (FILE, X);            \
  356.   else { putc ('#', FILE); output_addr_const (FILE, X); }}
  357.  
  358. #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  \
  359. { register rtx reg1, reg2, breg, ireg;                    \
  360.   register rtx addr = ADDR;                        \
  361.   rtx offset;                                \
  362.   switch (GET_CODE (addr))                        \
  363.     {                                    \
  364.     case REG:                                \
  365.       fprintf (FILE, "(%s)", reg_names[REGNO (addr)]);            \
  366.       break;                                \
  367.     case PRE_DEC:                            \
  368.       fprintf (FILE, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);    \
  369.       break;                                \
  370.     case POST_INC:                            \
  371.       fprintf (FILE, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);    \
  372.       break;                                \
  373.     case PLUS:                                \
  374.       reg1 = 0;    reg2 = 0;                        \
  375.       ireg = 0;    breg = 0;                        \
  376.       offset = 0;                            \
  377.       if (CONSTANT_ADDRESS_P (XEXP (addr, 0)))                \
  378.     {                                \
  379.       offset = XEXP (addr, 0);                    \
  380.       addr = XEXP (addr, 1);                    \
  381.     }                                \
  382.       else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)))            \
  383.     {                                \
  384.       offset = XEXP (addr, 1);                    \
  385.       addr = XEXP (addr, 0);                    \
  386.     }                                \
  387.       if (GET_CODE (addr) != PLUS) ;                    \
  388.       else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND)        \
  389.     {                                \
  390.       reg1 = XEXP (addr, 0);                    \
  391.       addr = XEXP (addr, 1);                    \
  392.     }                                \
  393.       else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND)        \
  394.     {                                \
  395.       reg1 = XEXP (addr, 1);                    \
  396.       addr = XEXP (addr, 0);                    \
  397.     }                                \
  398.       else if (GET_CODE (XEXP (addr, 0)) == MULT)            \
  399.     {                                \
  400.       reg1 = XEXP (addr, 0);                    \
  401.       addr = XEXP (addr, 1);                    \
  402.     }                                \
  403.       else if (GET_CODE (XEXP (addr, 1)) == MULT)            \
  404.     {                                \
  405.       reg1 = XEXP (addr, 1);                    \
  406.       addr = XEXP (addr, 0);                    \
  407.     }                                \
  408.       else if (GET_CODE (XEXP (addr, 0)) == REG)            \
  409.     {                                \
  410.       reg1 = XEXP (addr, 0);                    \
  411.       addr = XEXP (addr, 1);                    \
  412.     }                                \
  413.       else if (GET_CODE (XEXP (addr, 1)) == REG)            \
  414.     {                                \
  415.       reg1 = XEXP (addr, 1);                    \
  416.       addr = XEXP (addr, 0);                    \
  417.     }                                \
  418.       if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT        \
  419.       || GET_CODE (addr) == SIGN_EXTEND)                \
  420.     { if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; }    \
  421.       if (offset != 0) { if (addr != 0) abort (); addr = offset; }    \
  422.       if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND            \
  423.             || GET_CODE (reg1) == MULT))            \
  424.       || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2))))        \
  425.     { breg = reg2; ireg = reg1; }                    \
  426.       else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1)))        \
  427.     { breg = reg1; ireg = reg2; }                    \
  428.       if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF)    \
  429.         { int scale = 1;                        \
  430.       if (GET_CODE (ireg) == MULT)                    \
  431.         { scale = INTVAL (XEXP (ireg, 1));                \
  432.           ireg = XEXP (ireg, 0); }                    \
  433.       if (GET_CODE (ireg) == SIGN_EXTEND)                \
  434.         fprintf (FILE, "(L%d.b,pc,%s.w",                \
  435.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  436.              reg_names[REGNO (XEXP (ireg, 0))]);         \
  437.       else                                \
  438.         fprintf (FILE, "(L%d.b,pc,%s.l",                \
  439.              CODE_LABEL_NUMBER (XEXP (addr, 0)),        \
  440.              reg_names[REGNO (ireg)]);                \
  441.       if (scale != 1) fprintf (FILE, "*%d", scale);            \
  442.       putc (')', FILE);                        \
  443.       break; }                            \
  444.       if (breg != 0 && ireg == 0 && GET_CODE (addr) == LABEL_REF)    \
  445.         { fprintf (FILE, "(L%d.b,pc,%s.l",                \
  446.            CODE_LABEL_NUMBER (XEXP (addr, 0)),            \
  447.            reg_names[REGNO (breg)]);                \
  448.       putc (')', FILE);                        \
  449.       break; }                            \
  450.       if (ireg != 0 || breg != 0)                    \
  451.     { int scale = 1;                        \
  452.       if (breg == 0)                        \
  453.         abort ();                            \
  454.       if (addr && GET_CODE (addr) == LABEL_REF) abort ();        \
  455.       fprintf (FILE, "(");                        \
  456.       if (addr != 0) {                        \
  457.         output_addr_const (FILE, addr);                \
  458.         putc (',', FILE); }                        \
  459.       fprintf (FILE, "%s", reg_names[REGNO (breg)]);        \
  460.       if (ireg != 0)                        \
  461.         putc (',', FILE);                        \
  462.       if (ireg != 0 && GET_CODE (ireg) == MULT)            \
  463.         { scale = INTVAL (XEXP (ireg, 1));                \
  464.           ireg = XEXP (ireg, 0); }                    \
  465.       if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND)        \
  466.         fprintf (FILE, "%s.w", reg_names[REGNO (XEXP (ireg, 0))]);    \
  467.       else if (ireg != 0)                        \
  468.         fprintf (FILE, "%s.l", reg_names[REGNO (ireg)]);        \
  469.       if (scale != 1) fprintf (FILE, "*%d", scale);            \
  470.       putc (')', FILE);                        \
  471.       break;                            \
  472.     }                                \
  473.       else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF)        \
  474.     { fprintf (FILE, "(L%d.b,pc,%s.l)",                \
  475.            CODE_LABEL_NUMBER (XEXP (addr, 0)),            \
  476.            reg_names[REGNO (reg1)]);                \
  477.       break; }                            \
  478.     default:                                \
  479.       if (GET_CODE (addr) == CONST_INT                    \
  480.       && INTVAL (addr) < 0x8000                    \
  481.       && INTVAL (addr) >= -0x8000)                    \
  482.     fprintf (FILE, "%d.w", INTVAL (addr));                \
  483.       else                                \
  484.         output_addr_const (FILE, addr);                    \
  485.     }}
  486.  
  487. #else /* Using GAS, which uses the MIT assembler syntax, like a Sun.  */
  488.  
  489. #define FUNCTION_PROFILER(FILE, LABEL_NO) \
  490.    fprintf (FILE, "\tmovl #LP%d,d0\n\tjsr mcount\n", (LABEL_NO));
  491.  
  492. #endif /* MOTOROLA */
  493.